<?php

/**
 * Model
 * 
 * Camada base model
 * 
 *
 */

class Model {
    
    /**
     * Model::conectar()
     *
     * Faz conexão para acesso direto ao banco de dados 
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     */
    public function conectar()
    {
    	try
    	{
			/*
			$GLOBALS['host'] = "mysql58.linkedej.com.br";
			$GLOBALS['user'] = "linkedej59";
			$GLOBALS['password'] = "l1nK3DEj37";
			$GLOBALS['bd'] = "linkedej59";
			*/

			$GLOBALS['host'] = "localhost";
			$GLOBALS['user'] = "root";
			$GLOBALS['password'] = "root";
			$GLOBALS['bd'] = "hotel_fazenda";
			
			$conexao = mysql_pconnect( $GLOBALS['host'], $GLOBALS['user'], $GLOBALS['password'] ) or
	            die( mysql_error() );
	
	        mysql_select_db( $GLOBALS['bd'], $conexao ) or die( mysql_error() );
	        
        }catch(Exception $e)
        {
        	return false;
        }
    }


    /**
     * Model::query()
     *
     * Excecuta comando (SQL) diretamente no banco de dados
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     */
    public function query( $sql )
    {
		
        try{
          
            $this->conectar();

            $resultado = mysql_query($sql) or die(mysql_error()); 
			
			$this->desconectar();
			
			return $resultado;
           
            
        } catch(Exception $e)       { 
            echo "Erro ao executar a query</br>"; 
            return false;

        }
    }
    
    /**
     * Model::insert()
     *
     * Metodos faz inserções no banco de dados.
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param string $tabela - Informa qual a tabela onde os dados serão inseridos.
     * @param string $campos - Informa qual os campos da tabela receberão os dados. Formato (dado1,dado2...).
     * @param string $valores - Informa quais os valores a serem inseridos no banco. Formato (valor1,valor2...)
     */
    public function insert( $tabela, $campos, $valores )
    {
		/*
			Sql padrão de inserção
		*/
		$sql = "INSERT INTO ".$tabela." ".$campos." VALUES ".$valores;
		
		//echo $sql; exit;
		return $this->query($sql);
    }


	/**
     * Model::update()
     *
     * Metodos faz atualizações dos dados de uma tabela no banco de dados.
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param string $tabela - Informa qual a tabela onde os dados serão inseridos.
     * @param string $set - Informa qual os campos serão atualizados, assim como os novos dados. Formato CAMPO1=dado1, CAMPO2=dado2
     * @param string $condicao - Informa a condição para que os dados sejam atualizados
     */
    public function update( $tabela, $set, $condicao )
    {
		/*
			Sql padrão de inserção
		*/
		
		if ($condicao != "" ) $sql = "UPDATE ".$tabela." SET ".$set." WHERE ".$condicao;
        else $sql = "UPDATE ".$tabela." SET ".$set;
        
        return $this->query($sql);
    }
    
    /**
     * Model::delete()
     *
     * Metodos faz exclusoes no banco de dados.
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param string $tabela - Informa qual a tabela onde os dados serão inseridos.
     * @param string $condicao - Informa a condição para que os dados sejam removidos.
     */
    public function delete( $tabela, $condicao )
    {
		/*
			Sql padrão de inserção
		*/
        $sql = "DELETE FROM ".$tabela." WHERE ".$condicao;
        
        return $this->query($sql);
    }
    
    /**
     * Model::select()
     *
     * Metodos faz exclusoes no banco de dados.
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param string $tabela - Informa qual a tabela onde os dados serão inseridos.
     * @param string $dados - Informa quais os dados a serem buscados no banco de dados.
     * @param string $condicao - Informa a condição para que os dados sejam removidos.
     * @param string $group - Informa possiveis agrupamentos de dados.
     * @param string $order - Informa a ordem como os dados serão selecionados.
     */
    public function select( $tabela, $dados, $condicao="", $group="", $order="" )
    {
		/*
			Sql padrão de inserção
		*/
        $sql = "SELECT ".$dados." FROM ".$tabela;
        
        /*
			Complementação de uma query de busca.
        */
        if(!empty($condicao)) $sql.= " WHERE ".$condicao;
        
        if(!empty($group)) $sql.= " GROUP BY ".$group;
        
        if(!empty($order)) $sql.= " ORDER BY ".$order;
        return $this->query($sql);
    }

    /**
     * Model::desconectar()
     *
     * Encerra conexão com o banco de dados.
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * 
     */
    public function desconectar()
    {
        mysql_close();
    }


    /**
     * Model::converterDataTela()
     * 
     * Converte datas do formato armazenado no banco para o formato brasileiro.
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param string $data - Contém a data no formato armazenado no banco de dados.
     */
    public function converterDataTela($data)
    {
        if($data){
            $t = explode(" ", $data);
            $d = explode("-", $t[0]);
            $nova_data = $d[2] . "/" . $d[1] . "/" . $d[0];
            return $nova_data;
        }else{
            return "";
        }    
    }
    
    
    /**
     * Model::converterDataBanco()
     * 
     * Formata datas originadas de formulárioo formato do banco de dados(yyyymmdd).
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param string $data - Contém a data no formato brasileiro normal.
     * 
     */
    public function converterDataBanco( $data )
    {
        if($data){
            $d = explode( "/", $data );
            $d[0] = str_pad( $d[0], 2, "0", STR_PAD_LEFT );
            $d[1] = str_pad( $d[1], 2, "0", STR_PAD_LEFT );
            $d[2] = str_pad( $d[2], 4, "0", STR_PAD_BOTH );
            $nova_data = $d[2] ."-". $d[1] ."-". $d[0];
            return $nova_data;
        }else{
            return "";
        }
    }
    
    /**
     * Model::antiInjection()
     *
     * Verifica se houve tentativas de injection. 
     * Retorna uma string sem os caracteres suspeitos.
     * Método sedido por Fabio Ferraz.
     * 
     * @author Fabio Ferraz <fabioruffs@gmail.com>
     * @param $str - String a ser verificada.
     */
    public function antiInjection($str)
    {
		
        # Remove palavras suspeitas de injection.
        $str = preg_replace(sql_regcase(strtolower(("/(\n|\r|%0a|%0d|Content-Type:|bcc:|to:|cc:|Autoreply:|http|https|from|select|insert|update|delete|where|drop table|show tables |#|\*|--|\\\\)/"))),
            "", $str);
        $str = preg_replace(sql_regcase(strtoupper(("/(\n|\r|%0a|%0d|Content-Type:|bcc:|to:|cc:|Autoreply:|http|https|from|select|insert|update|delete|where|drop table|show tables |create table |#|\*|--|\\\\)/"))),
            "", $str);
        $str = trim($str);
        # Remove espaços vazios.
        $str = strip_tags($str); # Remove tags HTML e PHP.
        $str = addslashes($str); # Adiciona barras invertidas à uma string.
        //$str = mysql_real_escape_string($str); //Escapa a string para usar em uma consulta mysql
        return $str;
    }
    
    /**
     * Model::post()
     *
     * Faz o post e retorna ja com antiInjection
     * 
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param $campo - Nome do campo do formulário cujo dado deve ser obtido.
     * @param $nome - Parametro não obrigatorio, necessario para a validação.
     */
    public function post($campo,$nome=""){
		
		if (!empty($nome)){
			echo "0|O campo ".$nome." é obrigatório e deve ser preenchido";
			exit;
		}
		if (!empty($_POST[$campo]) ){
			//return $_POST[$campo];
            return trim($this->antiInjection( $_POST[$campo] ));
        } 
    }
    
    /**
     * Model::get()
     *
     * Faz o get e retorna ja com antiInjection
     * 
     * @author Antonio Marcos <amm.bernardes@gmail.com>
     * @param $campo - Nome do campo do formulário cujo dado deve ser obtido.
     */
    public function get($campo){

        if (!empty($_GET[$campo]) ){
            return trim($this->antiInjection( $_GET[$campo] ));
        } 
    }
    
    
    /**
     * Model::criaTabelas()
     *
     * 
     * 
     * @author Bruno Medeiros <brunomedeirosrafael@gmail.com>
     * 
     */
    public function criaTabelas(){
		$this->conectar();

			$sql = "CREATE TABLE IF NOT EXISTS Pessoa (
				id_pessoa				INT 			unsigned			NOT NULL	AUTO_INCREMENT,
				nome					VARCHAR(80)		CHARACTER SET utf8	NOT NULL,
				data_nascimento			DATE								NOT NULL,					
				cpf						VARCHAR(14)		CHARACTER SET utf8	NOT NULL,
				PRIMARY KEY (id_pessoa)
			)ENGINE = InnoDB";
		
		$resultado = $this->query($sql); 
		
			$sql = "CREATE TABLE IF NOT EXISTS usuarios (
					id_usuario			INT 			unsigned			NOT NULL 	AUTO_INCREMENT,
					login				VARCHAR(30) 	CHARACTER SET utf8	NOT NULL,
					senha				VARCHAR(15) 	CHARACTER SET utf8	NOT NULL,
					tipo_usuario 		VARCHAR(2) 	CHARACTER SET utf8	NOT NULL,
					PRIMARY KEY (id_usuario)				
				)ENGINE = InnoDB";

		$resultado = $this->query($sql); 
				
			$sql = "CREATE TABLE IF NOT EXISTS Cliente (
					id_cliente			INT 			unsigned			NOT NULL	AUTO_INCREMENT,
					fid_pessoa			INT 			unsigned			NOT NULL,
					fid_usuario			INT 			unsigned			NOT NULL,					
					PRIMARY KEY (id_cliente),
					FOREIGN KEY (fid_pessoa)	REFERENCES Pessoa (id_pessoa),
					FOREIGN KEY (fid_usuario)	REFERENCES usuarios (id_usuario)
				)ENGINE = InnoDB";	
			
		$resultado = $this->query($sql); 
				
			
			$sql = "CREATE TABLE IF NOT EXISTS Funcionario (
					id_funcionario		INT 		unsigned			NOT NULL	AUTO_INCREMENT,
					cargo				VARCHAR(80) 					CHARACTER SET utf8	NOT NULL,
					salario				FLOAT		unsigned 			NOT NULL,
					turno				VARCHAR(15) 					CHARACTER SET utf8	NOT NULL,
					fid_pessoa			INT 			unsigned			NOT NULL,
					fid_usuario			INT 			unsigned			NOT NULL,					
					PRIMARY KEY (id_funcionario),					
					FOREIGN KEY (fid_pessoa)	REFERENCES Pessoa (id_pessoa),
					FOREIGN KEY (fid_usuario)	REFERENCES usuarios (id_usuario)
				)ENGINE = InnoDB";	
			
		$resultado = $this->query($sql); 
			
		
			$sql = "CREATE TABLE IF NOT EXISTS Produto(
					id_produto				 INT				unsigned			NOT NULL	AUTO_INCREMENT,
					nome					 VARCHAR(80)		CHARACTER SET utf8	NOT NULL,
					descricao				 VARCHAR(150)		CHARACTER SET utf8	NOT NULL,
					tipo					 VARCHAR(80)		CHARACTER SET utf8	NOT NULL,
					suite					 VARCHAR(10)		CHARACTER SET utf8	NOT NULL,
					valor_produto			 FLOAT				unsigned			NOT NULL,					
					PRIMARY KEY (id_produto)
					
				)ENGINE = InnoDB";

		$resultado = $this->query($sql); 
		
			
		
			$sql = "CREATE TABLE IF NOT EXISTS Comanda(
					id_comanda				 INT				unsigned			NOT NULL	AUTO_INCREMENT,
					valor_total				 FLOAT				unsigned			NOT NULL,	
					fid_cliente 			 INT	 			unsigned			NOT NULL,			
					PRIMARY KEY (id_comanda),
					FOREIGN KEY (fid_cliente)	REFERENCES Cliente(id_cliente)
					
				)ENGINE = InnoDB";

		$resultado = $this->query($sql); 

		
			$sql = "CREATE TABLE IF NOT EXISTS Itens_comanda(
					id_item_comanda			 INT				unsigned			NOT NULL	AUTO_INCREMENT,
					fid_produto 			 INT	 			unsigned			NOT NULL,
					fid_comanda 			 INT	 			unsigned			NOT NULL,	
					valor					 FLOAT				unsigned			NOT NULL,		
					PRIMARY KEY (id_item_comanda),
					FOREIGN KEY (fid_produto)	REFERENCES Produto(id_produto),
					FOREIGN KEY (fid_comanda)	REFERENCES Comanda(id_comanda)
					
				)ENGINE = InnoDB";

		$resultado = $this->query($sql);
		
		
		$sql = "CREATE TABLE IF NOT EXISTS Reservas(
						id_reserva				 INT				unsigned			NOT NULL	AUTO_INCREMENT,
						data_inicio		   		 DATE									NOT NULL,
						data_fim		   		 DATE									NOT NULL,
						fid_produto				 INT	 			unsigned			NOT NULL,	
						fid_cliente				 INT	 			unsigned			NOT NULL,	
						fid_item_comanda		 INT	 			unsigned			NOT NULL,			
						PRIMARY KEY (id_reserva),
						FOREIGN KEY (fid_produto)	REFERENCES Produto (id_produto),
						FOREIGN KEY (fid_cliente)	REFERENCES Cliente (id_cliente),
						FOREIGN KEY (fid_item_comanda)	REFERENCES Itens_comanda (id_item_comanda)
						
					)ENGINE = InnoDB";

		$resultado = $this->query($sql); 
					
		$sql = "CREATE TABLE IF NOT EXISTS Estoque (
				id_item					INT				unsigned			NOT NULL		AUTO_INCREMENT,							
				nome					VARCHAR(40) 	CHARACTER SET utf8	NOT NULL,				
				quantidade				INT				unsigned			NOT NULL,
				preco					FLOAT			unsigned 			NOT NULL,
				PRIMARY KEY (id_item)

			)ENGINE = InnoDB";

			$resultado = $this->query($sql); 
			
			$sql = "CREATE TABLE IF NOT EXISTS Administrador (
					id_administrador			INT 			unsigned			NOT NULL 	AUTO_INCREMENT,
					salario						FLOAT			unsigned 			NOT NULL,
					turno						VARCHAR(15) 	CHARACTER SET utf8	NOT NULL,
					fid_funcionario				INT 			unsigned			NOT NULL,
					fid_usuario			INT 			unsigned			NOT NULL,					
					PRIMARY KEY (id_administrador),					
					FOREIGN KEY (fid_funcionario)	REFERENCES Funcionario (id_funcionario),
					FOREIGN KEY (fid_usuario)	REFERENCES usuarios (id_usuario)
				)ENGINE = InnoDB";

		$resultado = $this->query($sql); 
		
		//Insere o Administrador...
		

		$sql = "INSERT INTO `hotel_fazenda`.`usuarios` (
						`id_usuario` ,
						`login` ,
						`senha` ,
						`tipo_usuario`
						)
						VALUES (
						'40', 'admin', 'admin', '3'
						);";
		$resultado = $this->query($sql); 
		
		$sql = "INSERT INTO `hotel_fazenda`.`Pessoa` (
							`id_pessoa` ,
							`nome` ,
							`data_nascimento` ,
							`cpf`
							)
							VALUES (
							'39', 'Administrador', '2004-08-10', '123456789'
				);";
		
		$resultado = $this->query($sql);
		
		$sql = "INSERT INTO `hotel_fazenda`.`Funcionario` (
							`id_funcionario` ,
							`cargo` ,
							`salario` ,
							`turno` ,
							`fid_pessoa` ,
							`fid_usuario`
							)
							VALUES (
							'38', 'Administrador', '1312', 'Integral', '39', '40'
				);";
		
		$resultado = $this->query($sql);
		
		$sql = "INSERT INTO `hotel_fazenda`.`Administrador` (
							`id_administrador` ,
							`salario` ,
							`turno` ,
							`fid_funcionario` ,
							`fid_usuario`
							)
							VALUES (
							'37', '1312', 'Integral', '38', '40'
							);";
		
		$resultado = $this->query($sql);
		
		$this->desconectar();
				
    }
    
	/**
    * Controller::CalcularIdade()
    *
    * Calcula a idade a partir da data específicada no parâmetro $nascimento.
    * Retorna a idade obtida.
    *
    */
    function Calcularidade($data_nascimento){
		//Data atual.
		$data_calcula = date("Y-m-d");
		
		//as datas devem ser no formato aaaa-mm-dd
		//conversão das datas para o formato de tempo linux
		$data_nascimento = strtotime($data_nascimento." 00:00:00");
		$data_calcula = strtotime($data_calcula." 00:00:00");
		
		//cálculo da idade fazendo a diferença entre as duas datas
		$idade = floor(abs($data_calcula-$data_nascimento)/60/60/24/365);
		return($idade);

}
   
   /**
     * Model::obterCpfAluno()
     *
     * Busca no banco o cpf de um aluno.
     *
     * Autor: Antonio Marcos
     */
     
    public function obterCpfAluno($idAluno){
        
		$sql = "SELECT cpf 
				FROM alunos   
				WHERE alunos.id_aluno = ".$idAluno;
		
		$retorno = $this->query($sql);
		return ($retorno);		
	}
	
	/**
     * Model::obterDataNasc()
     *
     * Busca no banco a data de nascimento de um aluno.
     *
     * Autor: Antonio Marcos
     */
     
    public function obterDataNasc($idAluno){
        
		$sql = "SELECT data_nascimento 
				FROM alunos   
				WHERE alunos.id_aluno = ".$idAluno;
		
		$retorno = $this->query($sql);
		return ($retorno);		
	}
	
		
    
}
?>
